Amazon Redshift のスケジュールされたクエリの設定を図にしてみた
Amazon Redshift の「スケジュールされたクエリ」を設定するときに指定する IAM ロールの設定を理解するためにイメージ図を書いてみました。自身の備忘録も兼ねてブログ化します。
スケジュールされたクエリのイメージ図
スケジュールされたクエリを作成する際に指定する IAM ロールの信頼ポリシーにおいて、IAM ユーザーを信頼する必要があります。この設定を最初は理解できていなかったので、どのような設定になるか理解するためにイメージ図を書いてみました。
IAM ユーザーを信頼する記載がない場合は、スケジュールされたクエリの作成時にエラーとなります。また、作成済みのスケジュールされたクエリのスケジュール履歴を見ることができませんでした。
スケジュール
サンプルデータをロードした Redshift クラスタに対して、スケジュールされたクエリを設定してみます。なお、以降ではスケジュールされたクエリをスケジュールクエリと記載します。
IAM ユーザー/グループの作成
IAM ユーザー test-user
を作成して、次のポリシーをアタッチした IAM グループに所属させます。Redshift 用の権限のイメージで AWS 管理ポリシーを付けていますが、最小権限ではありませんのでご注意ください。
項目 | 設定値 |
---|---|
AWS 管理ポリシー | AmazonRedshiftFullAccess AmazonRedshiftQueryEditorV2FullAccess AmazonRedshiftDataFullAccess SecretsManagerReadWrite AmazonEventBridgeFullAccess AmazonSNSFullAccess ReadOnlyAccess |
カスタマー管理ポリシー | test-assume-role-policy |
test-assume-role-policy
のポリシーです。IAM ロールにスイッチロールする権限になります。Resource にスケジュールクエリ用 IAM ロールの ARN のみを指定することもできます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "*"
}
]
}
Amazon Redshift クラスターの作成
テスト用に Redshift クラスターを作成します。今回はサンプルデータをロードして利用します。なお、データベース名はデフォルト設定にしているため、dev
となっています。
スケジュールクエリ用 IAM ロールの作成
スケジュールクエリを設定するときに指定する IAM ロールを作成します。
許可ポリシーはユーザーガイドを参考に下表のポリシーをアタッチしています。また、認証情報を取得するための権限としてカスタマー管理ポリシーを作成してアタッチしています。
項目 | 設定値 |
---|---|
IAM ロール名 | test-redshift-schedule-query-role |
許可 - AWS 管理ポリシー | AmazonRedshiftDataFullAccess AmazonEventBridgeFullAccess |
許可 - カスタマー管理ポリシー | test-redshift-schedule-query-policy |
信頼ポリシー | 下記参照 |
test-redshift-schedule-query-policy
のポリシーです。Redshift に対してクエリを実行するユーザーの認証情報を取得するための権限です。今回は一時的なテスト目的であるため、クラスター作成時に指定した管理者ユーザーを利用しています。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "redshift:GetClusterCredentials",
"Resource": [
"arn:aws:redshift:*:*:dbuser:*/awsuser"
]
}
]
}
スケジュールクエリの認証については次のユーザーガイドに記載があります。
次は信頼ポリシーです。スケジュールクエリを作成して、スケジュール履歴を確認する想定である IAM ユーザーの信頼関係を設定しています。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"redshift.amazonaws.com",
"redshift-serverless.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
},
{
"Effect": "Allow",
"Principal": {
"Service": "events.amazonaws.com"
},
"Action": "sts:AssumeRole"
},
{
"Sid": "AssumeRole",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:user/test-user"
},
"Action": "sts:AssumeRole"
}
]
}
信頼ポリシーについては、次のユーザーガイドで紹介されています。今回の例では、Redshift Serverless は不要と思いますが、テスト目的であったため、ユーザーガイドの内容をそのまま採用しました。
Amazon Redshift スケジュールクエリの作成
Redshift のスケジュールクエリを作成します。
スケジュールクエリの実行を SNS 通知できるため、通知する場合は作成済みのトピックを利用するか事前に作成しておきます。このブログでは SNS の設定は省略します。
今回はクエリエディタ v2 ではない方のクエリエディタを利用しています。IAM ロールには、先ほど作成したスケジュールクエリ用のロールを指定します。クエリはレコードを 5 つ取得するだけの単純なものをテスト用に用意しました。
スケジュールクエリの設定の続きです。すぐに結果を確認できるように 5 分おきに実行する設定にしています。また、SNS 通知機能を利用してメールに通知する設定をしています。SNS 通知はオプション設定です。
設定後、しばらく待つとスケジュール履歴にクエリが表示され、ステータスが「成功」となっていることを確認できました。
スケジュールクエリの SNS 通知の例です。
{
"version": "0",
"id": "7ce5df25-83be-d272-d0d4-4ddcbf9cf6c9",
"detail-type": "Scheduled Event",
"source": "aws.events",
"account": "111122223333",
"time": "2024-10-24T02:30:00Z",
"region": "ap-northeast-1",
"resources": [
"arn:aws:events:ap-northeast-1:111122223333:rule/QS-test-cluster-schedule-query-1"
],
"detail": {}
}
なお、スケジュールクエリ用 IAM ロールにおいて、IAM ユーザーを信頼する信頼ポリシーの記載がない場合は、クエリ作成に失敗します。
また、作成済みのスケジュールクエリのスケジュール履歴を閲覧することもできません。
以上で、スケジュールクエリの作成は終わりです。
さいごに
Amazon Redshift のスケジュールされたクエリの設定に関して、スケジュールされたクエリにアタッチする IAM ロールの信頼ポリシーに IAM ユーザーの信頼が必要なことを理解するために図に書いてみました。
以上、このブログがどなたかのご参考になれば幸いです。